package okw.gui;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
import java.util.logging.Level;

import okw.database.DatabaseManager;
import okw.database.Election;
import okw.database.OKWConfiguration;
import okw.database.Packer;
import okw.database.State;
import okw.database.Voter;
import okw.gui.dialogs.DlgTerminalAddEdit;
import okw.gui.wizards.CreateConfigurationWizardWindow;
import okw.network.ConnectionO;
import okw.network.StanO;
import okw.network.Terminal;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolTip;

import core.exceptions.BadPasswordException;
import core.modules.Serializer;
import core.modules.LoggerModule;
import core.modules.configuration.ConfigurationManager;
import core.modules.configuration.Crypto;
import core.modules.database.SuperConfiguration;
import core.util.Converter;

/**
 * 
 * @author Maks Odpowiada za gui komisji okregowej
 * 
 */

public class MainWindowO {
	private static String configFilePath = "";

	private static String title = "Daj glos - komisja okregowa";
	private static Shell shell;
	private static DatabaseManager db = null;
	private static Thread packer = null;
	private static Set<Voter> voters = null;
	private static String szukane = "";
	public static Long electionNr = null;
	public static String token = "-1";
	public static ConnectionO cm;
	public static StanO stanO = null;

	public static Display display;

	private static Group dane = null;
	private static Table terminale = null;
	private static Table glosujacy = null;

	private static Label lbl = null;
	private static Label lbl2 = null;
	private static Button startGlos = null;
	private static Button zakGlos = null;
	
	private static LoggerModule logger;

	// Operacja zapisu configu danego OKW do pliku w okrelonym polozeniu
	// (!zaklada istnienie pliku)
	protected static void saveConfigurationToDB(String configFilePath,
			String password) throws IOException, BadPasswordException {
		// Kopia podanego configu do ./myConfig/myConfig
		BufferedReader reader = new BufferedReader(new FileReader(
				configFilePath));
		String line = null;
		StringBuilder stringBuilder = new StringBuilder();
		String ls = System.getProperty("line.separator");
		// odczyt pliku
		while ((line = reader.readLine()) != null) {
			stringBuilder.append(line);
			stringBuilder.append(ls);
		}
		reader.close();
		String xmlString = stringBuilder.toString();
		ConfigurationManager cm = ConfigurationManager.getInstance();
		cm.saveConfigToFile(cm.getMyConfigurationFolderName(),
				cm.getMyConfigurationFolderName(), xmlString);

		// Odszyfrowanie
		xmlString = Crypto.getInstance().decrypt(xmlString, password);

		SuperConfiguration coreconf = (SuperConfiguration) Converter
				.XMLToObject(xmlString);

		OKWConfiguration okwConfiguration = new OKWConfiguration(
				coreconf.getIdentificationField(), coreconf.getIp(),
				coreconf.getCipherKey(), coreconf.getPassword());

		if (okwConfiguration.verifyPassword(password)) {
			// zapis konfiguracji do bazy
			DatabaseManager.getInstance()
					.saveOKWConfiguration(okwConfiguration);
		} else
			throw new BadPasswordException();
	}

	public MainWindowO(Display display) {
		shell = new Shell(display, SWT.SHELL_TRIM & (~SWT.RESIZE) & (~SWT.MAX));
		shell.setText(title);
		db = DatabaseManager.getInstance();
		
	    try {
	    	logger = new LoggerModule("logger.log", null);
	    } catch (IOException e) {
	    	e.printStackTrace();
			throw new RuntimeException("Problems with creating the log files");
	    }
	    logger.getLoggerInstance().log(Level.FINE, "Start okregowej komisji wyborczej");

		State state = db.getState();
		if (state != null) {
			stanO = (StanO) Serializer.SToO(state.getState());
			stanO.setWlaczony(false);
			stanO.setNasluchiwanie(false);
			stanO.setPolaczenie(false);
		} else
			stanO = new StanO();

		cm = new ConnectionO();
		cm.start(stanO, db);

		center(shell);

		logowanie();
		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		if (packer != null)
			packer.stop();
		if (stanO.isGlosowanieZakonczone()) {
			db.prepareDatabase();
			stanO.zeruj();
		}
		cm.stop();
	    logger.getLoggerInstance().log(Level.FINE, "Koniec okregowej komisji wyborczej");
	    
	}

	private static void sprawdzToken(String hasloToken) {
		System.out.println(hasloToken);
		Long eleNr = db.getSelectedElectionId(hasloToken);
		if (eleNr != null) {
			System.out.println(eleNr);
			Boolean sprawdzToken = db.checkIfProperToken(hasloToken);
			if (sprawdzToken == true) {
				token = hasloToken;
				electionNr = eleNr;
				dane.dispose();
				init(true);
			} else if (sprawdzToken == false) {
				MessageBox mb = new MessageBox(shell);
				mb.setMessage("Token do innych wyborow niz trwajace");
				mb.open();
			} else {
				MessageBox mb = new MessageBox(shell);
				mb.setMessage("Blad");
				mb.open();
			}
		} else {
			// TODO: pobrac z bazy adres serwera i port!
			int port = 8888;
			String host = "localhost";
			try {
				if (!stanO.isPolaczenie())
					cm.connect(port, host);
				cm.getData(hasloToken);
				// czeka chwile, czy dane moze dojda
				Thread.sleep(2000);
				if (stanO.isDaneWyborcze()) {
					eleNr = db.getSelectedElectionId(hasloToken);
					if (eleNr != null) {
						Boolean sprawdzToken = db
								.checkIfProperToken(hasloToken);
						System.out.println(eleNr);
						if (sprawdzToken == true) {
							electionNr = eleNr;
							token = hasloToken;
							dane.dispose();
							init(true);
						} else if (sprawdzToken == false) {
							MessageBox mb = new MessageBox(shell);
							mb.setMessage("Token do innych wyborow niz trwajace");
							mb.open();
						} else {
							MessageBox mb = new MessageBox(shell);
							mb.setMessage("Blad");
							mb.open();
						}
					} else {
						MessageBox mb = new MessageBox(shell);
						mb.setMessage("Zly token");
						mb.open();
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
				MessageBox mb = new MessageBox(shell);
				mb.setMessage("Brak polaczenia i tokena w bazie");
				mb.open();
			}
		}
	}

	private static void logowanie() {
	    logger.getLoggerInstance().log(Level.FINE, "Logowanie");
		dane = new Group(shell, SWT.SHADOW_ETCHED_IN);

		Label label = new Label(dane, SWT.CENTER);
		label.setText("Podaj haslo i wybierz plik");
		label.setSize(200, 20);
		label.setLocation(55, 30);

		final Text haslo = new Text(dane, SWT.LEFT | SWT.BORDER);
		haslo.setSize(150, 20);
		haslo.setLocation(70, 50);
		haslo.setTextLimit(20);
		haslo.setEchoChar('*');

		Button wybierz = new Button(dane, SWT.PUSH | SWT.CENTER);
		wybierz.setSize(140, 25);
		wybierz.setLocation(75, 80);
		wybierz.setText("Wybierz plik");

		final Label label2 = new Label(dane, SWT.CENTER);
		label2.setText("Wybrany plik:");
		label2.setLocation(0, 110);
		label2.setSize(300, 80);

		Label label3 = new Label(dane, SWT.CENTER);
		label3.setText("Podaj swoj token");
		label3.setSize(200, 20);
		label3.setLocation(45, 200);

		final Text haslo2 = new Text(dane, SWT.LEFT | SWT.BORDER);
		haslo2.setSize(150, 20);
		haslo2.setLocation(70, 230);
		haslo2.setTextLimit(20);
		haslo2.setEchoChar('*');

		Button loguj = new Button(dane, SWT.PUSH | SWT.CENTER);
		loguj.setSize(140, 25);
		loguj.setLocation(75, 260);
		loguj.setText("Loguj");

		wybierz.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);

				String[] filterExtensions = new String[] { "*.xml", "*" };

				fileDialog.setFilterExtensions(filterExtensions);
				String abba = fileDialog.open();

				if (abba != null) {
					StringBuilder sb = new StringBuilder(abba);
					System.out.println(sb);
					configFilePath = sb.toString();

					int i = 0;
					while ((i = sb.indexOf("\\", i + 30)) != -1) {
						sb.replace(i, i + 1, "\\\n");
					}

					label2.setText("Wybrany plik:\n" + sb.toString());
				}
			}
		});

		// Logowanie musi zachowywac sie roznie w zaleznosci od stanu
		// konfiguracji
		loguj.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				String password = haslo.getText();
				// jesli nie ma hasla i tokena
				if ((password == null || password.equals(""))
						&& configFilePath == ""
						&& (haslo2.getText() == null || haslo2.getText()
								.equals(""))) {
					dane.dispose();
					init(false);
				} else {
					// Jesli podano sciezke do config'a
					if (!configFilePath.equals("")) {
						try {
							saveConfigurationToDB(configFilePath, password);
							if ((haslo2.getText() != null && !haslo2.getText()
									.equals(""))) {
								sprawdzToken(haslo2.getText());
							} else {
								dane.dispose();
								init(false);
							}
						} catch (IOException e) {
							e.printStackTrace();
						} catch (BadPasswordException e) {
							e.printStackTrace();
							MessageBox mb = new MessageBox(shell);
							mb.setMessage("Zle haslo");
							mb.open();
						}
					} else {
						// Jesli to OKW ma juz config'a w bazie
						if (DatabaseManager.getInstance().hasOKWConfiguration()) {
							// TODO: przemyslec jak to kiedys podmienic
							// Jesli haslo sie zgadza
							if (DatabaseManager.getInstance()
									.getOKWConfiguration()
									.verifyPassword(password)) {
								// jesli nie ma hasla do tokena
								if ((haslo2.getText() != null && !haslo2
										.getText().equals(""))) {
									sprawdzToken(haslo2.getText());
								} else {
									dane.dispose();
									init(false);
								}
							} else {
								MessageBox mb = new MessageBox(shell);
								mb.setMessage("Zle haslo");
								mb.open();
							}
						} else {
							MessageBox mb = new MessageBox(shell);
							mb.setMessage("Zle haslo");
							mb.open();
						}

					}

				}
			}
		});
		dane.pack();
		shell.pack();

	}

	private static void startSerwera() {
		int port = 9999;
		if (!stanO.isWlaczony()) {
			try {
				cm.startServer(port, null);
				cm.listen();
			    logger.getLoggerInstance().log(Level.FINE, "Start serwera");
				czyWlaczonyILista();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	private static void init(boolean podanHaslo) {

		// proba polaczenia z centrala
		if (!stanO.isPolaczenie()) {
			int port = 8888;
			String host = "localhost";
			try {
				cm.connect(port, host);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		final TabFolder tabFolder = new TabFolder(shell, SWT.BORDER);

		// ustawiamy stan wyborow;
		if (!token.equals("-1"))
			stanO.setElectionName(db
					.get(Election.class, MainWindowO.electionNr).getName());

		// wlaczamy tryb konfiguracji, lub glosowania
		konfiguracja(tabFolder);
		if (podanHaslo) {
			stanO.setKonfiguracja(false);
			glosowanie(tabFolder);
		} else
			stanO.setKonfiguracja(true);

		tabFolder.pack();
		shell.pack();
	}

	// zakladka konfiguracji
	private static void konfiguracja(TabFolder tabFolder) {
		TabItem tabItem = new TabItem(tabFolder, SWT.SHADOW_ETCHED_IN);
		tabItem.setText("Konfiguracja");
		dane = new Group(tabFolder, SWT.SHADOW_ETCHED_IN);

		startSerwera();

		terminale = new Table(dane, SWT.BORDER | SWT.SINGLE
				| SWT.FULL_SELECTION);
		terminale.setHeaderVisible(true);
		terminale.setLocation(10, 20);
		terminale.setSize(525, 435);

		TableColumn column1 = new TableColumn(terminale, SWT.NONE);
		column1.setText("Terminale");
		column1.setWidth(520);
		column1.setResizable(false);

		Button startServ = new Button(dane, SWT.PUSH);
		startServ.setSize(120, 20);
		startServ.setLocation(550, 20);
		startServ.setText("Restart serwera");

		Button polaczCent = new Button(dane, SWT.PUSH);
		polaczCent.setSize(120, 20);
		polaczCent.setLocation(550, 50);
		polaczCent.setText("Polacz z centrala");

		Button testPolo = new Button(dane, SWT.PUSH);
		testPolo.setSize(120, 20);
		testPolo.setLocation(550, 80);
		testPolo.setText("Rozpocznij test");

		lbl = new Label(dane, SWT.LEFT);
		lbl.setSize(140, 140);
		lbl.setLocation(550, 110);
		changeState();

		Button wczytajConfig = new Button(dane, SWT.PUSH);
		wczytajConfig.setSize(120, 22);
		wczytajConfig.setLocation(550, 220);
		wczytajConfig.setText("Wczytaj config");

		Button generujConfig = new Button(dane, SWT.PUSH);
		generujConfig.setSize(120, 22);
		generujConfig.setLocation(550, 260);
		generujConfig.setText("Generuj config");

		Button addTerminal = new Button(dane, SWT.PUSH);
		addTerminal.setSize(120, 22);
		addTerminal.setLocation(550, 300);
		addTerminal.setText("Dodaj terminal");

		Button editTerminal = new Button(dane, SWT.PUSH);
		editTerminal.setSize(120, 22);
		editTerminal.setLocation(550, 340);
		editTerminal.setText("Edytuj terminal");
		
		Button deleteTerminal = new Button(dane, SWT.PUSH);
		deleteTerminal.setSize(120, 22);
		deleteTerminal.setLocation(550, 380);
		deleteTerminal.setText("Usuń terminal");

		cm.aktualizacjaTerminali();
		aktualizujTerminale();

		terminale.addMouseTrackListener(new MouseTrackListener() {

			final ToolTip tip = new ToolTip(shell, SWT.BALLOON);

			public void mouseHover(MouseEvent event) {
				Point pt = new Point(event.x, event.y);
				Table table = (Table) event.widget;
				System.out.println(table);
				TableItem item = table.getItem(pt);
				if (item != null) {
					tip.setVisible(false);
					Terminal t = cm.getTerminal((String) item.getData());
					System.out.println(t + " " + t.getStan() + " "
							+ t.getSocket());
					if (t != null && t.getStan() != null
							&& t.getSocket() != null) {
						tip.setMessage("Info o terminalu:"
								+ "\nPolaczony: "
								+ (t.getStan().isPolaczenie() ? 1 : 0)
								+ "\nGlosRozp: "
								+ (t.getStan().isGlosowanieRozpoczete() ? 1 : 0)
								+ "\nGlosZako: "
								+ (t.getStan().isGlosowanieZakonczone() ? 1 : 0)
								+ "\nKonczGlos: "
								+ (t.getStan().isKonczenieGlosowania() ? 1 : 0)
								+ "\nTrwaGlos: "
								+ (t.getStan().isTrwaGlosowanie() ? 1 : 0)
								+ "\nDaneWybor: "
								+ (t.getStan().isOdebraneDane() ? 1 : 0));
					} else if (t != null) {
						tip.setMessage("Niepodlaczony, brak informacji");
					}
					Point loc = table.toDisplay(table.getLocation());
					tip.setLocation(loc.x + pt.x, loc.y + pt.y);
					tip.setVisible(true);

				} else {
					tip.setVisible(false);
				}

			}

			public void mouseExit(MouseEvent event) {

			}

			public void mouseEnter(MouseEvent event) {

			}
		});

		startServ.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event arg0) {
				startSerwera();
			}
		});

		// laczy z centrala
		polaczCent.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				if (!stanO.isPolaczenie()) {
					int port = 8888;
					String host = "localhost";
					try {
						cm.connect(port, host);
					} catch (Exception e) {
						MessageBox mb = new MessageBox(shell);
						mb.setMessage("Blad polaczenia z centrala");
						mb.open();
						e.printStackTrace();
					}
				}
			}
		});

		// przeprowadza test polaczenia
		testPolo.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				try {
					TestWindow tw = new TestWindow(shell, cm, stanO);
				    logger.getLoggerInstance().log(Level.FINE, "Test polaczenia");
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

		generujConfig.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {

				// Pobieramy z bazy wszystkie OKW
				ArrayList<okw.database.Terminal> okwList = (ArrayList<okw.database.Terminal>) db
						.getAll(okw.database.Terminal.class);

				WizardDialog wizardDialog = new WizardDialog(shell,
						new CreateConfigurationWizardWindow(okwList));
				wizardDialog.open();
			}
		});

		wczytajConfig.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);

				String[] filterExtensions = new String[] { "*.xml", "*" };

				fileDialog.setFilterExtensions(filterExtensions);
				fileDialog.open();

				// TODO: wywolac funkcje konfiguratora i otrzymac obiekt
				// ktory wpisze sie do bazy
			}
		});

		addTerminal.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {

				// FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
				// String[] filterExtensions = new String[] { "*.xml", "*" };
				// fileDialog.setFilterExtensions(filterExtensions);
				// fileDialog.open();

				DlgTerminalAddEdit dlg = new DlgTerminalAddEdit(shell,
						new okw.database.Terminal(), false);
				if (dlg.open() == IDialogConstants.OK_ID) {
					cm.aktualizacjaTerminali();
					aktualizujTerminale();
				}
			}
		});

		editTerminal.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				if (terminale.getSelectionIndex() >= 0) {

					okw.database.Terminal terminal = db
							.getTerminal((String) terminale.getSelection()[0]
									.getData());
					DlgTerminalAddEdit dlg = new DlgTerminalAddEdit(shell,
							terminal, true);
					if (dlg.open() == IDialogConstants.OK_ID) {
						cm.aktualizacjaTerminali();
						aktualizujTerminale();
					}
				} else {
					MessageBox mb = new MessageBox(shell);
					mb.setMessage("Wybierz terminal z listy");
					mb.open();
				}

			}
		});
		
		
		deleteTerminal.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				if (terminale.getSelectionIndex() >= 0) {
					DeleteTerminal dt = new DeleteTerminal(shell, (String) terminale.getSelection()[0]
							.getData(), cm);

					
				} else {
					MessageBox mb = new MessageBox(shell);
					mb.setMessage("Wybierz terminal z listy");
					mb.open();
				}

			}
		});

		dane.pack();
		tabItem.setControl(dane);
	}

	// zakladka glosowania
	private static void glosowanie(TabFolder tabFolder) {
		TabItem tabItem = new TabItem(tabFolder, SWT.SHADOW_ETCHED_IN);
		tabItem.setText("Glosowanie");
		dane = new Group(tabFolder, SWT.SHADOW_ETCHED_IN);

		startSerwera();
		// startuje packera wysylajacego glosy
		packer = new Thread(new Packer(cm, stanO));
		packer.start();

		glosujacy = new Table(dane, SWT.BORDER | SWT.SINGLE
				| SWT.FULL_SELECTION);
		glosujacy.setHeaderVisible(true);
		glosujacy.setLocation(10, 20);
		glosujacy.setSize(525, 435);
		glosujacy.setHeaderVisible(true);

		TableColumn column1 = new TableColumn(glosujacy, SWT.NONE);
		column1.setText("ID");

		TableColumn column2 = new TableColumn(glosujacy, SWT.NONE);
		column2.setText("Imie");

		TableColumn column3 = new TableColumn(glosujacy, SWT.NONE);
		column3.setText("Nazwisko");

		TableColumn column4 = new TableColumn(glosujacy, SWT.NONE);
		column4.setText("Adres");

		TableColumn column5 = new TableColumn(glosujacy, SWT.NONE);
		column5.setText("Glosowal");

		startGlos = new Button(dane, SWT.PUSH);
		startGlos.setSize(120, 20);
		startGlos.setLocation(550, 20);
		startGlos.setText("Zacznij glosowanie");
		startGlos.setEnabled(false);

		zakGlos = new Button(dane, SWT.PUSH);
		zakGlos.setSize(120, 20);
		zakGlos.setLocation(550, 60);
		zakGlos.setText("Zakoncz glosowanie");
		zakGlos.setEnabled(false);

		Button odznacz = new Button(dane, SWT.PUSH);
		odznacz.setSize(120, 22);
		odznacz.setLocation(550, 100);
		odznacz.setText("Odznacz votera");

		Button generujT = new Button(dane, SWT.PUSH);
		generujT.setSize(120, 22);
		generujT.setLocation(550, 140);
		generujT.setText("Generuj Tokeny");

		Button glosZam = new Button(dane, SWT.PUSH);
		glosZam.setSize(120, 22);
		glosZam.setLocation(550, 180);
		glosZam.setText("Voter zamiejscowy");

		Label label = new Label(dane, SWT.NONE);
		label.setLocation(550, 220);
		label.setText("Szukaj: ");
		label.pack();

		Text szukaj = new Text(dane, SWT.BORDER);
		szukaj.setSize(120, 20);
		szukaj.setLocation(550, 240);

		lbl2 = new Label(dane, SWT.LEFT);
		lbl2.setSize(140, 140);
		lbl2.setLocation(550, 280);
		changeState();

		aktualizujGlosujacych();
		czyWlaczonyILista();

		generujT.addSelectionListener(new SelectionListener() {

			public void widgetSelected(SelectionEvent arg0) {
				TokenGenerator tg = new TokenGenerator(shell);
			}

			public void widgetDefaultSelected(SelectionEvent arg0) {

			}
		});

		glosZam.addSelectionListener(new SelectionListener() {

			public void widgetSelected(SelectionEvent arg0) {

				Election election = db.get(Election.class, electionNr);
				election.getName();
				NonresidentWindow zw = new NonresidentWindow(shell, cm,
						election.getName(), stanO);
			}

			public void widgetDefaultSelected(SelectionEvent arg0) {

			}
		});

		odznacz.addSelectionListener(new SelectionListener() {

			public void widgetSelected(SelectionEvent arg0) {
				if (glosujacy.getSelectionIndex() >= 0
						&& glosujacy.getSelection()[0].getText(4).equals("nie")) {
					TableItem[] ti = glosujacy.getSelection();
					SelectVoter sv = new SelectVoter(shell, ti[0].getText(0));

				}

			}

			public void widgetDefaultSelected(SelectionEvent arg0) {

			}
		});

		// zaczyna glosowanie
		startGlos.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				if (stanO.isWlaczony() && !stanO.isGlosowanieZakonczone()
						&& !stanO.isKonczenieGlosowania()) {
					try {
					    logger.getLoggerInstance().log(Level.FINE, "Start glosowania");
						cm.startGlosowania();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		});

		// konczy glosowanie
		zakGlos.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				if (stanO.isWlaczony()) {
					try {
					    logger.getLoggerInstance().log(Level.FINE, "Koniec glosowania");
						cm.endVote();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		});

		szukaj.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				Text t = (Text) e.getSource();
				System.out.println(t.getText());
				szukane = t.getText();
				aktualizujGlosujacych(szukane);
			}

		});

		dane.pack();
		tabItem.setControl(dane);
	}

	// aktualizuje liste glosujacych w zakladce glosujacych
	public static void aktualizujGlosujacych() {
		display.asyncExec(new Runnable() {
			public void run() {
				if (glosujacy != null) {
					glosujacy.removeAll();
					DatabaseManager db = DatabaseManager.getInstance();
					Election election = db.get(Election.class, electionNr);
					voters = election.getVoters();

					if (!szukane.equals("")) {
						aktualizujGlosujacych(szukane);
						return;
					}

					TableColumn[] columns = glosujacy.getColumns();

					for (Voter v : voters) {
						v = db.get(Voter.class, v.getId());
						TableItem ti = new TableItem(glosujacy, SWT.NONE);
						ti.setText(0, v.getIdentificationField());
						ti.setText(1, v.getName());
						ti.setText(2, v.getSurname());
						ti.setText(3, v.getAddress());
						ti.setText(4, (v.getHasVoted() ? "tak" : "nie"));

					}
					for (TableColumn tc : columns) {
						tc.pack();
					}
				}
			}
		});

	}

	// aktualizuje lsite glosujacych w zakladce glosuajcych na podstawie Stringa
	// wyszukiwania
	private static void aktualizujGlosujacych(String text) {
		if (glosujacy != null) {
			glosujacy.removeAll();

			TableColumn[] columns = glosujacy.getColumns();

			for (Voter v : voters) {
				String test = v.getIdentificationField() + " " + v.getName()
						+ " " + v.getSurname() + " " + v.getAddress() + " "
						+ (v.getHasVoted() ? "tak" : "nie");
				if (test.contains(text)) {
					TableItem ti = new TableItem(glosujacy, SWT.NONE);
					ti.setText(0, v.getIdentificationField());
					ti.setText(1, v.getName());
					ti.setText(2, v.getSurname());
					ti.setText(3, v.getAddress());
					ti.setText(4, (v.getHasVoted() ? "tak" : "nie"));
				}

			}
			for (TableColumn tc : columns) {
				tc.pack();
			}
		}
	}

	// aktualizacja listy terminali - tylko tabele GUI.
	// ABY ZAKTUALIZOWAC PO ZMIANACH W BAZIE WYWOLAC METODE
	// cm.aktualizacjaTerminali()
	public static void aktualizujTerminale() {
		display.asyncExec(new Runnable() {
			public void run() {
				if (terminale != null) {
					ArrayList<Terminal> ter = cm.getTerminale();
					terminale.removeAll();
					for (Terminal t : ter) {
						TableItem item = new TableItem(terminale, SWT.NONE);
						item.setText(t.getName()
								+ " - "
								+ (t.getSocket() == null ? "niepolaczony"
										: "polaczony"));
						item.setData(t.getId());
					}
				}
			}
		});
	}

	// zmienia labela odpowiedzialnego za stan
	public static void changeState() {
		display.asyncExec(new Runnable() {
			public void run() {
				if (lbl != null) {
					lbl.setText("Stan:"
							+ "\nWlaczony: "
							+ (stanO.isWlaczony() ? 1 : 0)
							+ "\nPolaczony: "
							+ (stanO.isPolaczenie() ? 1 : 0)
							+ "\nGlosRozp: "
							+ (stanO.isGlosowanieRozpoczete() ? 1 : 0)
							+ "\nKonczenieGlos: "
							+ (stanO.isKonczenieGlosowania() ? 1 : 0)
							+ "\nZakonczGlos: "
							+ (stanO.isGlosowanieZakonczone() ? 1 : 0)
							+ "\nKonfig: "
							+ (stanO.isKonfiguracja() ? 1 : 0)
							+ "\nWybory: "
							+ (stanO.getElectionName() == null ? "brak" : stanO
									.getElectionName()) + "\nDaneWybor: "
							+ (stanO.isDaneWyborcze() ? 1 : 0));
				}
				if (lbl2 != null) {
					lbl2.setText(lbl.getText());
				}

			}
		});
	}

	public static void polaczono() {
	    logger.getLoggerInstance().log(Level.FINE, "Polaczono z centrala");
		display.asyncExec(new Runnable() {
			public void run() {
				System.out.println("Polaczono z centrala");
				// MessageBox messageBox = new MessageBox(shell,
				// SWT.ICON_INFORMATION);
				// messageBox.setMessage("Polaczono z centrala");
				// messageBox.open();
			}
		});

	}

	// blad polaczenia z komisja
	public static void bladPolaczenia() {
		logger.getLoggerInstance().log(Level.FINE, "Blad polaczenia z centrala");
		display.asyncExec(new Runnable() {
			public void run() {
				System.out.println("Blad polaczenia");
				MessageBox messageBox = new MessageBox(shell,
						SWT.ICON_INFORMATION);
				messageBox.setMessage("Blad polaczenia komisji z centrala");
				messageBox.open();

			}
		});
	}

	// rozpoczeto glosowanie - niepotrzebne
	public static void rozpoczetoGlosowanie() {
		display.asyncExec(new Runnable() {
			public void run() {

			}
		});
	}

	// zakonczono glosowanie - niepotrzebne
	public static void zakonczonoGlosowanie() {
		display.asyncExec(new Runnable() {
			public void run() {

			}
		});
	}

	// proszenie o rozpoczecie - niepotrzebne
	public static void gotowoscGlosowania() {
		display.asyncExec(new Runnable() {
			public void run() {
				MessageBox messageBox = new MessageBox(shell,
						SWT.ICON_INFORMATION);
				messageBox.setMessage("Prosimy rozpoczynac glosowanie");
				messageBox.open();
			}
		});
	}

	// proszenie o konczenie - niepotrzebne
	public static void konczenieGlosowania() {
		display.asyncExec(new Runnable() {
			public void run() {
				MessageBox messageBox = new MessageBox(shell,
						SWT.ICON_INFORMATION);
				messageBox.setMessage("Prosimy konczyc glosowanie");
				messageBox.open();
			}
		});

	}

	// wlaczony serwer
	public static void czyWlaczonyILista() {
		display.asyncExec(new Runnable() {
			public void run() {
				if (stanO.isWlaczony() && stanO.isDaneWyborcze()
						&& !stanO.isKonfiguracja()) {
					startGlos.setEnabled(true);
					zakGlos.setEnabled(true);
				}
			}
		});
	}

	// jak zakonczono porpawnie wybory
	public static void infoOKoncu() {
		logger.getLoggerInstance().log(Level.FINE, "Koniec wyborow");
		stanO.setKonczenieGlosowania(false);
		stanO.setGlosowanieZakonczone(true);

		display.asyncExec(new Runnable() {
			public void run() {
				MessageBox messageBox = new MessageBox(shell,
						SWT.ICON_INFORMATION);
				messageBox.setMessage("Wybory poprawnie zakonczone");
				messageBox.open();
			}
		});

	}

	// wysrodkowuje okno
	public static void center(Shell shell) {
		Rectangle bds = shell.getDisplay().getBounds();
		Point p = shell.getSize();

		int nLeft = (bds.width - p.x) / 2;
		int nTop = (bds.height - p.y) / 2;

		shell.setBounds(nLeft, nTop, p.x, p.y);
	}

	public static void main(String[] args) {
		display = new Display();
		new MainWindowO(display);
		display.dispose();
	}

}
